
package keul.planner.tools;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import keul.planner.entities.Station;

/**
 * Hier werden allgemeine Methoden gehalten, die keinem besonderem Kontext
 * zuzuordnen sind.
 * @author kev
 */
public class Tools {
    
    
    /**
     * Standardmäßig soll im Projekt der SHA-512-Algorhytmus gewählt werden.
     * @author kev
     * @param text
     * @return
     * @throws NoSuchAlgorithmException 
     */
    public static String generateSHA512Hash(String text) throws NoSuchAlgorithmException {
        return generateSHAHash(text, "SHA-512");
    }    
    /**
     * Diese Methode liefert einen Hash eines übergebenen Strings zurück.
     * Sie bedient sich dabei der java.security.MessageDigest-Klasse.
     * @author kev
     * @param text
     * @param algorithmString z.B. "SHA-1", "SHA-256" oder "SHA-512"
     * @return
     * @throws NoSuchAlgorithmException 
     */
    public static String generateSHAHash(String text, String algorithmString) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] bytes = md.digest( text.getBytes() );
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
                sb.append( Integer.toHexString( bytes[i] & 0xff ) );
        }
        return sb.toString();
    }
    

    /**
     * Diese Methode zeichnet ein Bild mit Stationen und deren Verbindungen.
     * Es hat dabei statisch die Größe von 1100x600 Pixel und bildet nur
     * den norddeutschen Bereich ab. Es zeichnet die Streckenverbindungen,
     * die Stationen werden mit Punkten markiert und beschriftet.
     * @param start
     * @param target
     * @return 
     */
    public static BufferedImage drawMap(List<Station> stationList) {

        BufferedImage mapImage = new BufferedImage(1100, 600, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = mapImage.createGraphics();
        StringBuffer sb = new StringBuffer();

        double xBase = 6.5;
        double yBase = 55;
        double xFactor = 150;
        double yFactor = 200;       
        
        int stationCount = stationList.size();
        for (int i = 1; i < stationCount; i++) {

            double x1 = (stationList.get(i-1).getStationLongitude()-xBase) * xFactor;
            double x2 = (stationList.get(i).getStationLongitude()-xBase) * xFactor;
            double y1 = (yBase - stationList.get(i-1).getStationLatitude()) * yFactor;
            double y2 = (yBase - stationList.get(i).getStationLatitude()) * yFactor;
            String name1 = stationList.get(i-1).getName();
            String name2 = stationList.get(i).getName();

            x2 = (stationList.get(i).getStationLongitude()-xBase)*xFactor;
            y2 = (yBase-stationList.get(i).getStationLatitude())*yFactor;
            g.setColor(Farbe.bleu);

            // Strecke von Start nach Zwischenhalt (bis Ziel)
            g.drawLine(((int) x1) + 1 , ((int) y1) + 1 , ((int) x2) + 1 , ((int) y2) + 1 );
            g.drawLine(((int) x1) , ((int) y1), ((int) x2) , ((int) y2) );

            // "weiterspringen"
            x1 = x2; y1 = y2; name1 = stationList.get(i).getName();

            // Zwischenhaltepunkt
            g.fillOval((int) x1 - 6, (int) y1 - 6, 12, 12);
            g.setColor(Farbe.WHITE);
            g.fillOval((int) x1 - 5, (int) y1 - 5, 10, 10);
            g.drawString(name1, ((int) x1) + 5, ((int) y1) - 15);
        }
        
        double x1 = (stationList.get(0).getStationLongitude()-xBase) * xFactor;
        double x2 = (stationList.get(stationCount-1).getStationLongitude()-xBase) * xFactor;
        double y1 = (yBase - stationList.get(0).getStationLatitude()) * yFactor;
        double y2 = (yBase - stationList.get(stationCount-1).getStationLatitude()) * yFactor;
        String name1 = stationList.get(0).getName();
        String name2 = stationList.get(stationCount-1).getName();

        g.setColor(Farbe.WHITE);        // Abfahrtspunkt
        g.fillOval((int) x1 - 8, (int) y1 - 8, 16, 16);
        g.drawString(name1, ((int) x1) + 5, ((int) y1) - 15);

        g.setColor(Farbe.WHITE);       // Ankunftspunkt
        g.fillOval((int) x2 - 8, (int) y2 - 8, 16, 16);
  
        return mapImage;
    }
}
